- 内容
Charlie 版 GCC として配布されているファイルの一覧を示します。
ただし、全てのファイルが単一のアーカイブとして配布されているとは
限りません。
1st.pen(tex)
2nd.pen(tex)
gcc.doc.html
gcc2.doc.html
gcc3.doc.html
COPYING FSF オリジナルのライセンス表示
COPYING.LIB FSF オリジナルのライブラリに関するライセンス表示
NEWS FSF による、最近のバージョンアップ概要
PROBLEMS FSF による、未解決不具合
PROJECTS FSF による、最適化をより有効にするソース記述のコツ
SERVICE FSF のスタッフリスト
gcc2.doc
objc/readme.x68 Objective-C のインストールについて補足
objc/readme.doc Objective-C の文法
gcc2.x コンパイルドライバ
g2cpp.x プリプロセッサ
g2as.x アセンブラ
g2lk.x リンカ
g2cc1.x Cコンパイラ
g2cc1plus.x G++コンパイラ
g2cc1obj.x Objective-C コンパイラ
libgcc.a Human68k 用ライブラリ
libgccsx.a SX 用ライブラリ
libobjc.a Human68k 用 Objective-C ライブラリ
libobjcsx.a SX 用 Objective-C ライブラリ
as/ アセンブラのドキュメントなど
lk/ リンカのドキュメントなど
include/objc/ Objective-C 用のヘッダファイル
objc/sample/ Objective-C のサンプルプログラム
- まず、あなたのシステムが以下の環境を満たしているかどうかを確認して下さい。
- 十分なmemory (4MB~)
コンパイラ本体だけでも 1MB 強ですので… (^_^;
自己コンパイル (数千~1万ステップの C のプログラム) には
フリーエリア 5.7MB と GRAM を要しました。
- TwentyOne
- LIBC (libc.a)
ライブラリを明示的に指定するのなら LIBC 以外でも可能
- HUPAIR 対応のシェル
ただしコンパイルドライバに長いコマンドラインを渡す場合のみ
- コンパイルドライバ gcc2.x はパス (環境変数 path) の通っている
ディレクトリに、ライブラリは lib の通っているディレクトリに
格納して下さい。
- その他の実行ファイルを一つのディレクトリに格納し、環境変数
COMPILER_PATH にディレクトリ名を指定して下さい
(gcc2.x はコンパイラ本体やアセンブラの検索を path よりも
優先して環境変数 COMPILER_PATH から行います)。
- 実行ファイルは execd に対応していますので、拡張子「.x」を
取り除いても実行ファイルとして認識されます。
優先順位は「.x 無し」→「.x 有り」です。
以上でインストールは完了しました。
- 動かない時は!!
予期した動作をしない場合、まずは付属のドキュメントなどを再度
読み直してみて下さい。前のバージョンから仕様が変更されているかも
しれません。
ドキュメントを読んでも明らかではない、あるいはバスエラー等
どうみてもバグとしか思えない状態に陥る、そんな場合は作者に報告し
て下さい。
GCC2 は巨大なプログラムですから、バグの存在は分かっていても
直ちに原因を突き止められないこともしばしばです。不具合の報告を
される時には、不具合を再現可能にする情報をできる限り添えて下さい。
すなわち、
- どのプログラム (コンパイラなのかアセンブラなのかコンパイル
ドライバなのか)で発生しているのか (-v オプションなどで
確かめられます)
- 処理を中断するようなエラーなら、どのようなメッセージが出るか
- どのようなプログラムをコンパイル (アセンブル)した際に
発生するか (ソースを提示して、何行目で発生するなど)
- 関係ありそうな環境変数
- メモリや常駐アプリの状態、OS・マシンの種別
などです。
- FSF 版、まりこ版との仕様比較(概要)
- FSF GCC 2.6.x と比較して
- シフト JIS コードが文字列にも識別子にも使用できます。
- 割り込み関数の動作が細かく制御できます。
- スタックフレームに使用するレジスタを指定することができます。
- コンパイルエラー時に自動的にエディタを起動することができます。
- MC68000 のための最適化を追加してあります。
- SX WINDOW のためのライブラリと組み合わせることで、プログラムコードを共有しながら
タスクごとに独立な変数を持つようにできます(通称 SX モード)
- SX WINDOW のために LASCII 文字列が表記しやすいようになっています。
- まりこ版 (Version 1.2x based on FSF GCC 1.4x) と比較して
- まりこ版との仕様の違い
Charlie 版 は GCC 2.6.3 をベースに、まりこ版に近い改造を
施してありますが細かい違いもあります。この章ではまりこ版を
使用しているユーザーを対象にそういった仕様の違いを解説します。
なお、ここに明言されていないものでもまりこ版の Ver.1.41 以降の
改良、仕様変更には対応していないことがあります。
まりこ版と Charlie 版の機能比較
まりこ版 | Charlie 版 |
環境変数 |
MARINA | GCC2_ED |
MARIKO | GCC2_OPTION0 |
GCC_OPTION | GCC2_OPTION1 |
GCC_AS | 同等の機能なし |
GCC_LINK | 〃 |
SX モード |
-SX | まりこ版と同等 |
-z-stack= |
-z-heap= |
LASCII 文字列 |
SXCALL |
DOSCALL |
remote |
relocate |
common |
-fpicでSXモード | -fpic は使用できない |
拡張機能 |
pcr | まりこ版と同様 |
-fansi-only |
2 進表記中の「_」 |
ジャンプ系命令 |
デフォルトは jbsr | まりこ版と同様 |
-fall-bsr | まりこ版と同様 |
-fall-jsr は廃止 | -fall-jsr は存在 |
-mregparm | 動作チェック未済 |
コマンドライン |
自力 wild-card展開 | 展開機能なし(HUPAIR 対応) |
-+-+- | インダイレクト機能なし |
テンポラリの .o ファイルを生成するディレクトリ |
カレント | 環境変数 temp |
- GCC2_OPTION2、
G2CASTS、G2CASTC という独自の環境変数も参照します。
- 特に指定を行わない場合
mc68000 / コプロ無し / g2as (based on HAS v3.0) syntax
という環境のためのコードを出力します。
- 030 モードと 020 モードの出力アセンブラソースは全く同じに
なります。
- fppp で加工を行ないたい場合、-ffppp オプションを指定してください。
- LIBC のヘッダファイル群を include すると GCC の built-in
宣言と型が一致していないという warning を受けることがありま
す。新版の LIBC では stdio.h を string.h よりも前に include することで
回避できます。
- メッセージは一部しか日本語化されていません。
- 文字列定数などを PC 相対参照にするかどうかを、デフォルトでは
アセンブラに任せています。文字列定数を全て PC 相対にしたい
場合は -fstrings-pcr を指定して下さい。
- db** を使ったループ最適化を利用するためには、
環境変数 GCC2_OPTION0 に G を指定しなければなりません。
- メッセージ無しに処理を中断してしまう時、原因の多くはコンパ
イラのスタック不足です。まりこ版に比べてスタックは多めに指定
して下さい。
- asm オペランドの制約文字などを厳密に記述していないと、
GCC v1 では問題にならなくても GCC v2 では通らないことが
あります。
- SXCALL, DOSCALL 関数の引数部分を空にして宣言した時は
void として扱います。
- 定数乗算展開は GCC v2 になって、FSF が独自に組み込んでいます。
展開した方が速くなるかどうかは機種ごとの命令コスト表をみて
判断するので -f(no-)const-mult-expand は無視されます。
- g2cc1.x の生成コードはまりこ版のものとほぼ互換性がありますが、
g2cc1plus.x ではラベル生成規則が違うので、まりこ版 G++ との
出力コードレベルでの互換性はありません。全体の再コンパイルを
お勧めします。
- G++ はバージョンアップの度に大幅に文法が変更されています。
すなわち、まりこ版で処理できても Charlie 版ではエラーになっ
たり違う意味に解釈されることがあります。
たとえばクラス宣言中での static 記述が 2.6.3 では単純に
「宣言」として扱われます。つまりクラス宣言の後で「定義」を
別個に行う必要があります。
- デフォルトで定義される識別子が多少異なります。
(__GNUC__ =2 等)
- -nostdinc を指定しない時は環境変数 C_PATH を
インクルードファイルの検索パスとみなします。
- -lang-c で C_PATH の次に C_INCLUDE_PATH をサーチ。
- -lang-c++ を指定すると include するファイルを
CPLUS_INCLUDE_PATH → cplusplus_include →
gcc_include → include
とサーチします。また注釈記号`//'が処理されます。
- -lang-objc で #import が処理されます。
OBJC_INCLUDE_PATH をサーチ。
- -lang-objc++ で`//'と #import の両方が処理されます。
OBJCPLUS_INCLUDE_PATH をサーチ。
(objc++ という言語がある訳ではなく、pre-process の
方法指定です)
- パスは
実行ファイル:COMPILER_PATH → path
ライブラリ:lib → LIB → LIBRARY_PATH → LPATH
などと見ていきます。それぞれの環境変数でパスの区切り「;」が使用できます。
- 実行ファイル名を変更した時は /lib/specs の所定の場所に
記述すれば、そちらを見ます。ただし、リンカだけは例外で、
デフォルトから変更できないものと思われます (原因 : 手抜き改造)。
- 環境変数 MARINA / 満里奈 でエディタ名だけではなく、コマンド
ラインを指定できます。まりこ版でもこのような記述ができました
が、それを HUPAIR でサポートしています。
- wchar_t型の2バイト文字の処理が異なります。
int * wide = L"a""b";
をコンパイルすると
まりこ版 |
00 00 82 81 00 00 00 82 00 00 00 82 00 00 00 00 |
Charlie版 |
00 00 82 81 00 00 82 82 00 00 00 00 |
となります。
- Charlie 版独自の仕様
環境変数 GCC2_OPTION2 の各文字の意味
- g2as は default ではファイル名先頭の "/" をスイッチと
誤認します。ksh などでは環境変数 G2AS の 1 文字目に "*" を
加えて、これを禁止して下さい。
- g2as g2lk などは Human V3 の DOSCALL 番号を使用しています。
V2 で使って白い窓が出てしまった場合は、
gcc2 -v とでもやって、一度ベクタを初期化して下さい。
- 付属のリンカが出力するファイルには、静的コンストラクタ/デ
ストラクタの処理ルーチンテーブルが付加されます。このため、
(純正の) lk.x / hlk.x で生成したものとはバイナリ表現上、一部
異なる実行ファイルが作成されます。また手抜きですが、マップ
ファイルを作成すると、 ___CTOR_LIST__ などは正しいセクショ
ン/ロケーションを表示していません。無視して下さい。
- 上記の処理を抑止するリンカオプション -0 を追加してあります。
hlk と同じ動作になります。Charlie 版の libgcc(sx).a を
リンクするものは -0 を使用することはできません。
- LIBC 以外での動作は確認していません。
- 必ず付属の libgcc(sx).a をリンクして下さい。
(gcc2.x が自動的にリンクします)
libgccsx は SX モード専用です。
- atexit()関数で静的デストラクタ処理を起動しています。
atexit()を使用しているプログラムは注意して下さい。
また、atexit を利用できない一部の SX 用のスタートアップ
ルーチンをリンクすると、正しい動作をしないこともあります。
- 数値演算の結果が他のライブラリと異なっている可能性もあります。
- default では大文字の拡張子「.C」は G++ のソース、
「.S」はプリプロセッサを通すアセンブリソースと認識されます。
それぞれを C のソース、通常のアセンブリソースと認識させる
ためには環境変数 G2CASTC、G2CASTS を (内容は何でもよいから)
定義してください。
- オリジナルの GCC 2.x ではループの条件判定を
↓
┌ループ開始時の条件判定
│ ↓
│ループ内処理←──────┐
│ ↓ │
│条件判定─────────┘
└→↓
ループの前の部分にもコード展開します。ループ開始時には条件の
真偽値の一部が分かっていることがあるので、その場合には条件判
定コードを省いて速度の向上が見込めます。
しかし大部分のループでは真偽値が分からないため、ただ単に条
件判定コードが増えるだけになってしまいます。
そこで Charlie 版のデフォルトでは 1.x と同様に
↓
┌─┘
│ループ内処理←──────┐
└→↓ │
条件判定─────────┘
↓
と展開します。GCC2_OPTION2 に L を記述すると本来の 2.x の展
開方法を用います。実際に試せば分かりますが、かなり特殊な状況で
なければ効果は期待できません。
また l を記述すると、判定部分が非常に小さくなることが
分っている場合(分岐命令が1つと、付随する0~2つの代入・比較命令のみ)だけ
展開を行うようにします
(この場合、コードサイズ的には 2~8 bytes 程度の損をする代わりに
10 clock 分程度の得をする換算になります)。
- Lv.3 Exp.11 から追加した「メモリ参照を等価のレジスタ参照に
書き替える」最適化のルーチンでは、物理的には同じアドレスを同一
関数内で異なるポインタから扱っていた場合などのチェックができま
せん。例えば
void foo (int *p, int *q) {
int r = *p;
bar (r, (*q = 0, *p));
}
のような場合に第 2 引数も r にしてしまいます。よって、この最適化は
-fcache-memref を指定した時にのみ機能するように変更しました。
- -fsx-fixed-location を -SX と同時に指定すると、
a5 相対アドレス機能だけを OFF することができます。
- E1 >> E2 は ANSI の定義では E1 のビット長 W1 に対して
W1 <= E2 なら結果は不定となっており、gcc2 のデフォルト値は 0 です。
E1 が signed で符号ビットだけは残したい、といった場合には
環境変数 GCC2_OPTION2 に S を記述してください。
- 環境変数 GCC2_OPTION2 に B を記述すると、
関数の引数に(unsigned)(exp ? 255:0)という表現があった場合にSccの値を
直接スタックに積む最適化を行います。真偽値引数を多用するプログラムで
少しでも速度を稼ぎたい場合のための機能です。
- GCC version 2 としての仕様
- GCC v2 では -x {ファイルの言語種別指定} が使えます。これは、
このオプションから次の -x オプションまでの入力ファイルを
拡張子に関係なく指定された処理系で処理します。
指定できるのは、
-xc cpp → cc1 (.c)
c++ cpp → cc1plus (.cc .cxx .C)
objective-c cpp → cc1obj (.m)
cpp-output cc1 (.i)
c++-cpp-output cc1plus (.ii)
objective-c-cpp-output cc1obj
assembler as (.s)
assembler-with-cpp cpp → as (.S)
none 拡張子で識別するモードに戻す
です。 -xnone については、ソースより、
/* Suppress the warning if -xnone comes after the last input file,
because alternate command interfaces like g++ might find it
useful to place -xnone after each input file. */
だそうです。
- specs ファイルというのは、
gcc2 -dumpspecs > /lib/specs
などとやると生成されるテキストファイルです。エディタで編集
することで、自分の環境に合わせた設定を行うことができます。
内容は、
*~~: (設定項目)
内容
(1 空行、すなわち改行コード 1 個)
の繰り返しです。内容を省略する場合は、*~~:の後に空行が
2 行続くことになります。内容が 2 行以上にわたる場合は、C で
文字列を次行につなげるのと同様に
*lib:
%{lne*tstep:appkit.a%s} \
%{lne*tstep:soundkit.a%s} \
%{lne*tstep:musickit.a%s} \
%{lc@iro:ole.a%s}
*startfile:
などとします。空行を必要以上に記述してはいけません。
*lib:
(空行)
を
*lib:
%{ldos:libdos2.a%s}
^
としておけば、-ldos を指定した時に、libdos2.a をリンクする
ようになります。specs が見付からない場合や、specs 内に記述
されていない場合、-l** は
lib**.{環境変数 GCC_LIB(デフォルト`.a')}
に展開されます。
なお、GCC_LIB は specs に記述してしまったものには効きません。
(つまり、上の例では libdos2 は .a しか探さない、ということ。)
ほかに手軽に使えそうなものとして、specs 内の
*predefines:
-Dmc68000 -Dhuman68k -DHUMAN68K -DMARIKO_CC -Dmariko_cc
に、定義しておきたいものを記述しておけば、プリプロセッサに
渡されます。前後に __ がないものは(上の例では全て)、
mc68000
__mc68000
__mc68000__
のように 3 通りに展開されます。 __ を含んでいるものは、加工
なしで渡されます。
他の機能の動作はチェックしていません。特にリンカのスイッチ処理行は内部
処理の関係上、全く効かないはずです。
- 自動定義される識別子は
常時:mc68000 human68k HUMAN68K MARIKO_CC mariko_cc
__mc68000 __human68k __HUMAN68K __MARIKO_CC __mariko_cc
__mc68000__ __human68k__ __HUMAN68K__ __MARIKO_CC__
__mariko_cc__
__GNUC__=2 __GNU_MINOR__=6
-SX:SX_GCC __SX_GCC__
G++:__GNUG__=2 __cplusplus
-funsigned-char:__CHAR_UNSIGNED__
-ansi:__STRICT_ANSI__
-O* (0 以外):__OPTIMIZE__
-mshort:__MSHORT__
-m68881:__HAVE68881__
-m68020:__MC68020__
-m68020-40:__MC68020__
-m68030:__MC68020__ __MC68030__
-m68040:__MC68020__ __MC68040__ __HAVE68881__
です。
- -V Version でコンパイラのバージョンを指定できます。
具体的には環境変数 COMPILER_PATH の下にサブディレクトリを
作成してコンパイラ本体(g2cc1.x など)を置き、サブディレクトリ
名をバージョンとして指定します。
ex. COMPILER_PATH=a:\gcc2 で -VLv.2 とすると、
a:\gcc2\Lv.2 から実行ファイルを検索します。
a:\gcc2 に実行ファイルがあってもサブディレクトリが優先します。
- original 2.6.3(by FSF)との相違、その他
- -I prefix オプションは未対応です。
- long double はあまり動作チェックしていません。
- libg++ はバンドルしていません。
必要ならば、各自ソースを用意して
このコンパイラでコンパイルして下さい m(__)m
- -fpic オプションの動作は保証されません。-O を同時に指定
しないとコンパイルできませんし、指定したとしても付属の
g2as では処理できません。
- original には combine 最適化フェーズに不具合があり、-O を
指定すると以下のソースを正しくコンパイルできません。
char *a;
char *f1(char *c){
char *q=16;
while(*q==0)*q++=0;
// ループを抜けると、q は不定
a=(char*)((((unsigned int)q)+15)&-16);
while(*q==0)*q++=0;
}
移植の際に処理を変更してありますが、エンバグの可能性が
あります。
- original には combine 最適化フェーズに不具合があり、-O を
指定すると以下のソースを正しくコンパイルできません。
int func(void){
register int x asm("a0");
asm("someCmd" : "=a"(x));
return x;
}
移植の際に処理を変更してありますが、エンバグの可能性があります。
- original には loop 最適化フェーズに不具合があり、-O2
-ffroce-mem を指定すると以下のソースを正しくコンパイルできません。
typedef struct W {
short o;
char f;
} W;
typedef struct MW {
int o;
} MW;
void
foo(W *wp, MW *mwp)
{
for (; wp;) {
for (; mwp;)
if (mwp->o == wp->o)
wp->f = 0;
}
}
移植の際に処理を変更してあり誤ったコードを出力しないようにしてあり
ますが、そのために original の持つ最適化性能の一部が損なわれています。
- 権利など
全体は GPL に準拠していますが、アセンブラ/リンカは GNU ware
ではありませんので、取り扱いには十分注意して下さい。
- 転載をする場合は、アフターサポートに十分な配慮を行って下さい。
- 日本語メッセージや MARIKO, MARINA などの名称はまりこ氏の考案
したものです。
- コンパイラのソースの一部は近藤氏、まりこ氏、Charlie が記述
したものです。
- アセンブラ表記はモトローラ Inc.、シャープ(株)、(株)ハドソン、
YuNK氏、Charlie が考えたものです。
- アセンブラのソースは YuNK氏、Charlie が記述したものです。
- オブジェクトファイルの表記はシャープ(株)、(株)ハドソン、
Charlie が考えたものです。
- リンカのソースは SALT氏、Charlie が記述したもので、バイナリ
の扱いは現在 HLK と同等です(改造物であることと、改造者を
明記するという条件下で)。
- ライブラリの演算部分は村田氏が Oh!X 誌で紹介したアルゴリズム
と Ohtsuki 版 gnulib 1.46 を参考にしています。
- Project LIBC の LIBC を使用しています。
なお、g2as に関しては
- has を参照していることを使用者が認め
- YuNK 氏に氏名表示権があり
- YuNK 氏による元祖 has の活動(改訂/公開など)を妨げず
- 不具合いの報告などは Charlie が全て受け
- 公益に反しない目的で
- 内容に関しては無保証/リスクに関しては最終当事者責任で
- 誰でも、元のままの内容で入手できる権利を妨げられず
- 入手したい者が、何かの代償を求められたり、今以上の制限を課せ
られたりしない
という範囲内で使用・配布を認められています。
- 転載・配布など
- 転載・配布先を報告する必要はありません。
- 原著作権者・団体の名前が掲げられていますが、この配布物に関し
ての問い合わせは全て Charlie、あるいは転載・配布者に行う点
を明示して下さい。
- 転載の場合、2nd.doc で示したファイル全てがほぼ同様の手段で
入手できるようにして下さい。差分修正のアーカイブなどの場合、
一部のファイルが含まれていないことがありますが、この場合でも
2nd.doc で示したファイルの最新版が全てほぼ同様の手段で入手で
きるようにしなければなりません。すなわち以前のアーカイブを残
しておくか、あるいは差分に含まれなかったファイルを以前のアー
カイブから抽出して再登録するかして下さい。
- 修正差分などを転載・配布する時は、「Charlie 版 GCC」の
一部であることを明記して下さい。そうしないと g2as や g2lk
など名称だけでは混乱を生じる恐れがあります。(g2as, g2lk は
HAS, HLK 上位互換で Charlie 版「専用」ではありませんが)
- アフターサポートを十分に行って下さい。
- 転載時の登録名(Lzh や TGZ のアーカイブ名)は自由に変更して
かまいませんが、中身のファイル名は変更すると混乱のもとになる
ので変更しないで下さい。紹介文は適宜変更してかまいません。
- 謝辞
初期の段階から協力をいただいている中村ちゃぷに氏、HAS,FAS,HLK
のソースを提供してくださった YuNK 氏、H.O 氏、SALT 氏、バグ潰し
の叩き台として SXgzip を与えてくださった BAA 氏、連日の修正で
負担をお掛けしたひどり氏、そして network SX の皆さんに感謝いたし
ます。
また、移植にあたって数多くの作品を利用させていただきました。
関係者の方々に感謝いたします。以下にその一部を掲示させていただき
ます。
GCC まりこ版 1.39 X6_05 ~ 1.28(TOOLS)
microEmacs J1.31
Gnu Make/Awk/Sed
GDB
HAS/FAS
HLK
HAR
LIBC
TwentyOne
hcommand
ITA TOOLS
lndrv/execd
ksh/bash
TMN/tmsio
Gnu zip/tar
LHA/ISH
Bdif/Bup
SXgzip